home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
CD ROM Paradise Collection 4
/
CD ROM Paradise Collection 4 1995 Nov.iso
/
program
/
swagd_f.zip
/
DATETIME.SWG
/
0052_Fast and Useful Date routines.pas
< prev
next >
Wrap
Pascal/Delphi Source File
|
1995-02-28
|
4KB
|
169 lines
{
Here you have my DayUtil, I'm sure you can use that instead. As a bonus you
get a function that returns the daynumber of Eastern Day a certain year (yes!
it's true! :) plus some other useful(?) related functions.
- = * = -
}
unit DayUtil;
{ some useful date&time related functions }
{ PD by Björn Felten @ 2:203/208 -- Nov 1994 }
{$g+} { three shift instructions need this }
interface
function dayNo(Ye,Mo,Da:word): word; {calculate the daynumber 1..366}
function easternDay(Ye:word): word; {what day Eastern Day is that year}
function getYear: word; inline($b4/$2a/$cd/$21/$89/$c8);
function getMonth: word; inline($b4/$2a/$cd/$21/$30/$e4/$88/$f0);
function getDay: word; inline($b4/$2a/$cd/$21/$30/$e4/$88/$d0);
function getDow: word; inline($b4/$2a/$cd/$21/$30/$e4);
function getHour: word; inline($b4/$2c/$cd/$21/$30/$e4/$88/$e8);
function getMin: word; inline($b4/$2c/$cd/$21/$30/$e4/$88/$c8);
function getSec: word; inline($b4/$2c/$cd/$21/$30/$e4/$88/$f0);
function workDay(Ye,Mo,Da,Wd:word): boolean; {returns true if a working day}
implementation
function dayNo;assembler;
asm
mov bx,Ye
mov cx,Mo
dec cx (* Month = 0..11 *)
mov di,Da
{ if Month>2 then }
cmp cx,1
jle @janfeb
{ S := ((Year mod 4) + 3) div 4 + (4 * Month + 23) div 10 - 1 }
and bx,3
add bx,3
shr bx,2
mov ax,cx
inc ax
shl ax,2
add ax,23
cwd
push cx
mov cx,10
div cx
pop cx
dec ax
add bx,ax
jmp @eif
{ else }
@janfeb:
{ S := 0; }
xor bx,bx
@eif:
{ DayNo:= 31 * (Month - 1) + Day - S; }
mov ax,cx
mov cx,31
mul cx
add ax,di
sub ax,bx
end;
function easternDay;assembler;
{ uses Gauss' Eastern formula to calculate Eastern Day }
{ you're not supposed to understand this... :) }
{ it took me quite some while to convert the "formula" from }
{ the look up tables, that I found in my encyclopaedia, into }
{ pure, working assembler, so enjoy... }
asm
mov ax,Ye
cmp ax,99
jg @noadd
cmp ax,80
jg @not2000
add ax,100
@not2000:
add ax,1900
@noadd:
mov bx,ax
cwd
mov cx,19
div cx
mov ax,dx
mul cx
add ax,24
mov cx,30
div cx
mov si,dx
mov ax,bx
and ax,3
shl ax,1
mov di,ax
mov ax,bx
cwd
mov cx,7
div cx
mov ax,dx
shl ax,2
add di,ax
mov ax,si
shl ax,1
add ax,si
shl ax,1
add ax,5
add ax,di
cwd
div cx
add dx,si
add dx,81
and bx,3
jne @no29
inc dx
@no29:
mov ax,dx
end;
(*
(In other countries than Sweden you may have other holidays
than we have here. But you'll probably recognize Ascension Day,
Whit-Monday and the other holidays below, so it shouldn't
be that difficult to work out your own, country specific,
modifications to get the workDay function working properly...)
För svenska förhållanden gäller följande beträffande helgdagar:
Sun:=(WeekDay='S') or {Söndag}
(ThisDate='01 Jan') or {Nyårsdagen}
(ThisDate='06 Jan') or {Trettondedagen}
(ThisDate='01 May') or {1:sta maj}
(ThisDate='25 Dec') or {Juldagen}
(ThisDate='26 Dec'); {Annandag jul}
EFri:=EasternDay-2; {Långfredag}
EMon:=EFri+3; {Annandag påsk}
ADay:=EMon+38; {Kristi himmelsfärdsdag}
WMon:=ADay+11; {Annandag pingst}
*)
function workDay;
var dn,ed:word;
begin
dn:=dayNo(Ye,Mo,Da); ed:=easternDay(Ye);
workDay:=not
((Wd= 0) or(Wd= 6) or {Söndag eller Lördag}
((Da= 1)and(Mo= 1)) or {Nyårsdagen}
((Da= 6)and(Mo= 1)) or {Trettondedagen}
((Da= 1)and(Mo= 5)) or {1:sta maj}
((Da=25)and(Mo=12)) or {Juldagen}
((Da=26)and(Mo=12)) or {Annandag jul}
(dn=ed- 2) or {Långfredag}
(dn=ed+ 1) or {Annandag påsk}
(dn=ed+39) or {Kristi himmelsfärdsdag}
(dn=ed+50)) {Annandag pingst}
end;
end.